package GUI;

import CDB.Categorias;
import CDB.Detalleproducto;
import CDB.Detallesubcategoria;
import CDB.Producto;
import CDB.Stock;
import CDB.Subcategoria;
import Negocios.ControlCategories;
import Negocios.ControlProduct;
import Negocios.ControlProductDetail;
import Negocios.ControlStock;
import Negocios.ControlSubcategory;
import Negocios.ControlSubcategoryDetail;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.beans.PropertyVetoException;
import java.sql.Time;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;

/**
 *
 * @author lightemp
 */
public class AltaProducto extends javax.swing.JInternalFrame {

    private String mensajeVal = null;//Advertencia si no se cumplen validaciones
    private JTextField[] txtPrecioSubcategoria;//Guarda el precio de las listaSubcategorias
    private JCheckBox[] chkHabilitaSubcategoria;//Activa o desactiva una listSubcategorias
    private JPanel[] jpnPrecios;
    private int numSubCategorias = 0;//Numero de supcategorias
    private boolean tieneSubcategorias = false;
    private Detalleproducto detallePro = null;
    private boolean isTipo, isProducto = false;

    public AltaProducto() {
        initComponents();
        llenarCombos();//Llena las cajas de lista
        txtConsumoProducto.setText("0");//Establece como valor inicial de consumo en 0
        inicializaGeneraPrecios();//Genera las cajas de texto para precios automaticamente        
    }

    public AltaProducto(Detalleproducto detalle) {
        initComponents();
        detallePro = detalle;
        //llenarCombos();//Llena las cajas de lista
        txtConsumoProducto.setText(String.valueOf(detallePro.getConsumo()));//Establece como valor inicial de consumo en 0
        txtNombreProducto.setText(detallePro.getProducto().getNombre());
        txtNombreProducto.setEditable(false);
        txtNombreProducto.setForeground(Color.GRAY);
        spnHora.setValue(detalle.getTiempoprepacion().getHours());
        spnMinuto.setValue(detalle.getTiempoprepacion().getMinutes());
        spnSegundo.setValue(detalle.getTiempoprepacion().getSeconds());
        cmbTipo.removeAllItems();
        cmbTipo.addItem(detalle.getTipo());
        cmbCategoria.addItem(detalle.getProducto().getCategorias().getIdcategoria()
                + "-" + detalle.getProducto().getCategorias().getNombre());
        cmbStock.addItem(detalle.getProducto().getStock().getNombre());
        inicializaGeneraPrecios();//Genera las cajas de texto para precios automaticamente
        marcaSubcategorias();
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        btgSubcategoria = new javax.swing.ButtonGroup();
        jSpinner4 = new javax.swing.JSpinner();
        btgGranel = new javax.swing.ButtonGroup();
        jPanel3 = new javax.swing.JPanel();
        jPanel1 = new javax.swing.JPanel();
        txtNombreProducto = new javax.swing.JTextField();
        txtConsumoProducto = new javax.swing.JTextField();
        jpnCategorias = new javax.swing.JPanel();
        cmbCategoria = new javax.swing.JComboBox();
        jpnStock = new javax.swing.JPanel();
        cmbStock = new javax.swing.JComboBox();
        jpnTiempo = new javax.swing.JPanel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        spnHora = new javax.swing.JSpinner();
        spnMinuto = new javax.swing.JSpinner();
        spnSegundo = new javax.swing.JSpinner();
        jPanel6 = new javax.swing.JPanel();
        cmbTipo = new javax.swing.JComboBox();
        jpnGranel = new javax.swing.JPanel();
        rbnSiGranel = new javax.swing.JRadioButton();
        rbnNoGranel = new javax.swing.JRadioButton();
        jspnCosto = new javax.swing.JScrollPane();
        jpnContenedorSubcategorias = new javax.swing.JPanel();
        jpnControles = new javax.swing.JPanel();
        jLabel2 = new javax.swing.JLabel();
        btnGuardarProducto = new javax.swing.JButton();
        btnCancelarProducto = new javax.swing.JButton();
        lblInformacionUsuario = new javax.swing.JLabel();

        setTitle("Sales dispatcher - Alta de un producto nuevo.");
        setToolTipText("Agregar un producto nuevo al inventario.");
        setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/IconosGenerales/Product.png"))); // NOI18N

        jPanel1.setBackground(new java.awt.Color(255, 255, 255));
        jPanel1.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.LOWERED));

        txtNombreProducto.setFont(new java.awt.Font("Dialog", 3, 14)); // NOI18N
        txtNombreProducto.setForeground(new java.awt.Color(0, 102, 0));
        txtNombreProducto.setBorder(javax.swing.BorderFactory.createTitledBorder("Nombre del producto"));
        txtNombreProducto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                txtNombreProductoActionPerformed(evt);
            }
        });
        txtNombreProducto.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txtNombreProductoKeyTyped(evt);
            }
        });

        txtConsumoProducto.setFont(new java.awt.Font("Dialog", 3, 12)); // NOI18N
        txtConsumoProducto.setForeground(new java.awt.Color(0, 102, 0));
        txtConsumoProducto.setBorder(javax.swing.BorderFactory.createTitledBorder("Consumo:"));
        txtConsumoProducto.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                txtConsumoProductoKeyTyped(evt);
            }
        });

        jpnCategorias.setBackground(new java.awt.Color(255, 255, 255));
        jpnCategorias.setBorder(javax.swing.BorderFactory.createTitledBorder("Categoria:"));

        cmbCategoria.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                cmbCategoriaMousePressed(evt);
            }
        });
        cmbCategoria.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                cmbCategoriaItemStateChanged(evt);
            }
        });
        cmbCategoria.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cmbCategoriaActionPerformed(evt);
            }
        });
        cmbCategoria.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                cmbCategoriaPropertyChange(evt);
            }
        });

        javax.swing.GroupLayout jpnCategoriasLayout = new javax.swing.GroupLayout(jpnCategorias);
        jpnCategorias.setLayout(jpnCategoriasLayout);
        jpnCategoriasLayout.setHorizontalGroup(
            jpnCategoriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(cmbCategoria, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        jpnCategoriasLayout.setVerticalGroup(
            jpnCategoriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(cmbCategoria, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
        );

        jpnStock.setBackground(new java.awt.Color(255, 255, 255));
        jpnStock.setBorder(javax.swing.BorderFactory.createTitledBorder("Stock:"));

        javax.swing.GroupLayout jpnStockLayout = new javax.swing.GroupLayout(jpnStock);
        jpnStock.setLayout(jpnStockLayout);
        jpnStockLayout.setHorizontalGroup(
            jpnStockLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpnStockLayout.createSequentialGroup()
                .addComponent(cmbStock, javax.swing.GroupLayout.PREFERRED_SIZE, 202, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        jpnStockLayout.setVerticalGroup(
            jpnStockLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpnStockLayout.createSequentialGroup()
                .addComponent(cmbStock, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        jpnTiempo.setBackground(new java.awt.Color(255, 204, 153));
        jpnTiempo.setBorder(javax.swing.BorderFactory.createTitledBorder("Tiempo de preparacion:"));
        jpnTiempo.setFont(new java.awt.Font("Dialog", 1, 12)); // NOI18N

        jLabel3.setBackground(new java.awt.Color(255, 255, 255));
        jLabel3.setText("Hora");

        jLabel4.setBackground(new java.awt.Color(255, 255, 255));
        jLabel4.setText("Min");

        jLabel5.setBackground(new java.awt.Color(255, 255, 255));
        jLabel5.setText("Seg");

        spnHora.setModel(new javax.swing.SpinnerNumberModel(0, 0, 23, 1));
        spnHora.setOpaque(false);
        spnHora.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                spnHoraKeyTyped(evt);
            }
        });

        spnMinuto.setModel(new javax.swing.SpinnerNumberModel(0, 0, 59, 1));
        spnMinuto.setOpaque(false);
        spnMinuto.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                spnMinutoKeyTyped(evt);
            }
        });

        spnSegundo.setModel(new javax.swing.SpinnerNumberModel(0, 0, 59, 1));
        spnSegundo.setOpaque(false);
        spnSegundo.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                spnSegundoKeyTyped(evt);
            }
        });

        javax.swing.GroupLayout jpnTiempoLayout = new javax.swing.GroupLayout(jpnTiempo);
        jpnTiempo.setLayout(jpnTiempoLayout);
        jpnTiempoLayout.setHorizontalGroup(
            jpnTiempoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpnTiempoLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jpnTiempoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jLabel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(spnHora, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jpnTiempoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(spnMinuto, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jpnTiempoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(spnSegundo, javax.swing.GroupLayout.DEFAULT_SIZE, 44, Short.MAX_VALUE)
                    .addComponent(jLabel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addGap(0, 0, Short.MAX_VALUE))
        );

        jpnTiempoLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {spnHora, spnMinuto, spnSegundo});

        jpnTiempoLayout.setVerticalGroup(
            jpnTiempoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpnTiempoLayout.createSequentialGroup()
                .addGroup(jpnTiempoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(jLabel4)
                    .addComponent(jLabel5))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jpnTiempoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(spnHora, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(spnMinuto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(spnSegundo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(0, 6, Short.MAX_VALUE))
        );

        jpnTiempoLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {jLabel3, jLabel4, jLabel5, spnHora, spnMinuto, spnSegundo});

        jPanel6.setBackground(new java.awt.Color(255, 255, 255));
        jPanel6.setBorder(javax.swing.BorderFactory.createTitledBorder("Presentacion:"));

        cmbTipo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Taza", "Tetera para 2", "Tetera para 3" }));

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, 201, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addComponent(cmbTipo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 7, Short.MAX_VALUE))
        );

        jpnGranel.setBackground(new java.awt.Color(255, 255, 255));
        jpnGranel.setBorder(javax.swing.BorderFactory.createTitledBorder("A granel:"));

        rbnSiGranel.setBackground(new java.awt.Color(255, 255, 255));
        btgGranel.add(rbnSiGranel);
        rbnSiGranel.setText("Sí");
        rbnSiGranel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rbnSiGranelMouseClicked(evt);
            }
        });
        rbnSiGranel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbnSiGranelActionPerformed(evt);
            }
        });

        rbnNoGranel.setBackground(new java.awt.Color(255, 255, 255));
        btgGranel.add(rbnNoGranel);
        rbnNoGranel.setSelected(true);
        rbnNoGranel.setText("No");
        rbnNoGranel.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                rbnNoGranelMouseClicked(evt);
            }
        });
        rbnNoGranel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                rbnNoGranelActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jpnGranelLayout = new javax.swing.GroupLayout(jpnGranel);
        jpnGranel.setLayout(jpnGranelLayout);
        jpnGranelLayout.setHorizontalGroup(
            jpnGranelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpnGranelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(rbnSiGranel, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(rbnNoGranel, javax.swing.GroupLayout.PREFERRED_SIZE, 66, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jpnGranelLayout.setVerticalGroup(
            jpnGranelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jpnGranelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                .addComponent(rbnSiGranel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                .addComponent(rbnNoGranel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
        );

        jspnCosto.setBorder(javax.swing.BorderFactory.createTitledBorder("Precios de las subcategorías"));
        jspnCosto.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        javax.swing.GroupLayout jpnContenedorSubcategoriasLayout = new javax.swing.GroupLayout(jpnContenedorSubcategorias);
        jpnContenedorSubcategorias.setLayout(jpnContenedorSubcategoriasLayout);
        jpnContenedorSubcategoriasLayout.setHorizontalGroup(
            jpnContenedorSubcategoriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 592, Short.MAX_VALUE)
        );
        jpnContenedorSubcategoriasLayout.setVerticalGroup(
            jpnContenedorSubcategoriasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 319, Short.MAX_VALUE)
        );

        jspnCosto.setViewportView(jpnContenedorSubcategorias);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jspnCosto, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(jPanel6, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jpnCategorias, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(txtConsumoProducto, javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtNombreProducto))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(jpnTiempo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jpnStock, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jpnGranel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(txtNombreProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(txtConsumoProducto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jpnTiempo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(0, 0, 0)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jPanel6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jpnGranel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jpnCategorias, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jpnStock, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jspnCosto, javax.swing.GroupLayout.PREFERRED_SIZE, 149, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        jpnControles.setBackground(new java.awt.Color(153, 153, 153));
        jpnControles.setForeground(new java.awt.Color(153, 153, 153));

        jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/IconosGenerales/Product.png"))); // NOI18N

        btnGuardarProducto.setIcon(new javax.swing.ImageIcon(getClass().getResource("/IconosGenerales/save.png"))); // NOI18N
        btnGuardarProducto.setMnemonic('1');
        btnGuardarProducto.setText("Guardar");
        btnGuardarProducto.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        btnGuardarProducto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnGuardarProductoActionPerformed(evt);
            }
        });

        btnCancelarProducto.setIcon(new javax.swing.ImageIcon(getClass().getResource("/IconosGenerales/Cancel.png"))); // NOI18N
        btnCancelarProducto.setMnemonic('1');
        btnCancelarProducto.setText("Cancelar");
        btnCancelarProducto.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        btnCancelarProducto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarProductoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jpnControlesLayout = new javax.swing.GroupLayout(jpnControles);
        jpnControles.setLayout(jpnControlesLayout);
        jpnControlesLayout.setHorizontalGroup(
            jpnControlesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpnControlesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jpnControlesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jpnControlesLayout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jLabel2))
                    .addComponent(btnCancelarProducto)
                    .addComponent(btnGuardarProducto, javax.swing.GroupLayout.PREFERRED_SIZE, 132, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        jpnControlesLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {btnCancelarProducto, btnGuardarProducto});

        jpnControlesLayout.setVerticalGroup(
            jpnControlesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jpnControlesLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(btnGuardarProducto, javax.swing.GroupLayout.PREFERRED_SIZE, 36, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnCancelarProducto, javax.swing.GroupLayout.PREFERRED_SIZE, 33, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel2)
                .addContainerGap())
        );

        jpnControlesLayout.linkSize(javax.swing.SwingConstants.VERTICAL, new java.awt.Component[] {btnCancelarProducto, btnGuardarProducto});

        lblInformacionUsuario.setBackground(new java.awt.Color(255, 255, 255));
        lblInformacionUsuario.setText("<html>Esta ventana permite crear nuevos productos,contiene los elementos necesarios para crearlos, <br>tales como categorias, subcategorias y stock entre otros.</html>");
        lblInformacionUsuario.setHorizontalTextPosition(javax.swing.SwingConstants.LEFT);

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(lblInformacionUsuario, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jpnControles, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(0, 3, Short.MAX_VALUE))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
                .addGap(2, 2, 2)
                .addComponent(lblInformacionUsuario, javax.swing.GroupLayout.PREFERRED_SIZE, 39, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jpnControles, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void txtNombreProductoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtNombreProductoActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_txtNombreProductoActionPerformed

    private void llenarCombos() {
        //Controles para llenar los comoboBox
        ControlCategories controlCategories = new ControlCategories();
        List listCategories = controlCategories.selectAll();
        ControlStock controlStock = new ControlStock();
        List listStock = controlStock.selectAll();
        //Reviso si hay categorias y stock
        //Deshabilito controles si no existen
        if (listCategories.size() > 0) {
            if (listStock.size() > 0) {
                //Llenado de comboBox
                try {
                    //Crea la lista de categorias
                    for (int i = 0; i < listCategories.size(); i++) {
                        Categorias categoria = (Categorias) listCategories.get(i);
                        cmbCategoria.addItem(categoria.getIdcategoria() + "-" + categoria.getNombre());
                    }
                    //Crea la lista de stock
                    for (int i = 0; i < listStock.size(); i++) {
                        Stock stock = (Stock) listStock.get(i);
                        cmbStock.addItem(stock.getIdstock() + "-" + stock.getNombre());
                    }

                } catch (Exception e) {
                    JOptionPane.showMessageDialog(this, "El error es:" + "\n" + e, "Error", 0);
                }
            } else {
                deshabilitaControles();
                JOptionPane.showMessageDialog(this, "No hay Stock registrado en la base de datos." + "\n"
                        + "Antes de poder insertar productos debe tener al menos un Stock.", "No hay Stock",
                        2);
            }
        } else {
            deshabilitaControles();
            JOptionPane.showMessageDialog(this, "No hay categorias registradas en la base de datos." + "\n"
                    + "Antes de poder insertar productos debe tener al menos una categoría.", "No hay categorias",
                    2);
        }

    }

    //Creo que es obvio lo que hace ¬¬
    private void deshabilitaControles() {
        txtNombreProducto.setEnabled(false);
        txtConsumoProducto.setEnabled(false);
        jpnCategorias.setEnabled(false);
        jpnStock.setEnabled(false);
        spnHora.setEnabled(false);
        spnMinuto.setEnabled(false);
        spnSegundo.setEnabled(false);
        cmbCategoria.setEnabled(false);
        cmbStock.setEnabled(false);
        cmbTipo.setEnabled(false);
        btnGuardarProducto.setEnabled(false);
    }

    private void btnCancelarProductoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarProductoActionPerformed
        try {
            this.setClosed(true);
            System.gc();
        } catch (PropertyVetoException ex) {
            this.dispose();
            System.gc();
        }
    }//GEN-LAST:event_btnCancelarProductoActionPerformed

    //Vacia las cajas de texto
    //Restaura valores
    private void limpiaCampos() {
        txtNombreProducto.setText("");
        txtConsumoProducto.setText("0");
        spnHora.setValue(0);
        spnMinuto.setValue(0);
        spnSegundo.setValue(0);
        inicializaGeneraPrecios();
    }

    private void marcaSubcategorias() {
        ControlProductDetail conpro = new ControlProductDetail();
        //Busca los productos por nombre y por tipo
        List listPro = conpro.selectByProductTipe(detallePro.getTipo(), detallePro.getProducto().getNombre());
        //Busca coincidencias en los nombres de las subcategorias y las marca
        for (int i = 0; i < numSubCategorias; i++) {
            String nombreSub = txtPrecioSubcategoria[i].getName();
            for (int j = 0; j < listPro.size(); j++) {
                Detalleproducto detalle = (Detalleproducto) listPro.get(j);
                String nombre = detalle.getSubcategoria().getNombre();
                String costo = String.valueOf((int) detalle.getCosto());
                //Si las subcategorias coinciden con las anteriores las marca
                //y pone precio
                if (nombreSub.equals(nombre)) {
                    chkHabilitaSubcategoria[i].setSelected(true);
                    txtPrecioSubcategoria[i].setEnabled(true);
                    txtPrecioSubcategoria[i].setText(costo);
                    jpnPrecios[i].setBackground(new java.awt.Color(0, 150, 0));
                }
            }
        }
    }

    //Establece la organizacion de los componentes de un panel
    private void organizaLayouts(JPanel panel) {
        panel.setLayout(new GridLayout(0, 4, 3, 3));
    }

    //Genera los precios para un productoEditar si no hay subcategorias
    //o mucho precios si hay subcategorias
    private void inicializaGeneraPrecios() {
        //Prepara los paneles
        jpnContenedorSubcategorias.setVisible(false);
        jpnContenedorSubcategorias.removeAll();
        //Asigna organizacion
        organizaLayouts(jpnContenedorSubcategorias);
        //Genera los campos para los precios
        generaPrecios();
        //Muestra los cambios realizados
        jpnContenedorSubcategorias.setVisible(true);
    }

    //Genera las listaSubcategorias de la categoria elegida y las muestra
    //Dentro de un panel
    private void generaPrecios() {
        //Nombre de la listSubcategorias
        String nombreSubcategoria = null;
        //Las subcategorias vienen de DetalleSubcategoria
        List listaSubcategorias = buscaSubcategorias();//Obteniendo la lista de listaSubcategorias
        //Si piden subcategorias y existen
        if (tieneSubcategorias) {
            numSubCategorias = listaSubcategorias.size();//No. de listSubcategorias que tiene la categoria
        } else {
            //si no hay pideSubcategorias por omision solo habra un tipo de productoEditar
            numSubCategorias = 1;
        }
        //Redimensionando arreglos a la catidad de listaSubcategorias
        txtPrecioSubcategoria = new JTextField[numSubCategorias];//Cajas de texto
        JLabel lblNomSub[] = new JLabel[numSubCategorias];//Etiquetas con el nombre
        jpnPrecios = new JPanel[numSubCategorias];//Paneles
        chkHabilitaSubcategoria = new JCheckBox[numSubCategorias];//Checkbox        
        for (int i = 0; i < numSubCategorias; i++) {
            Detallesubcategoria detalleSubCat = null;
            final int indice = i;
            try {
                //Pide subcategorias y existen subcategorias
                if (tieneSubcategorias) {
                    //Las subcategorias vienen de DetalleSubcategoria por eso la conversion
                    detalleSubCat = (Detallesubcategoria) listaSubcategorias.get(i);
                    //Nombre de la listSubcategorias
                    if (detalleSubCat.getSubcategoria() != null) {
                        nombreSubcategoria = detalleSubCat.getSubcategoria().getNombre();
                    } else {
                        nombreSubcategoria = "-";
                    }

                } else {
                    //Si no se eligieron pideSubcategorias o no existen en la BD
                    //Por defecto se dará el nombre genérico de productoEditar
                    nombreSubcategoria = "Producto";
                }
            } catch (ArrayIndexOutOfBoundsException e) {
                JOptionPane.showMessageDialog(this, detalleSubCat.getCategorias().getNombre() + " no tiene subcategorias", "No hay subcategorías", 2);
            } catch (Exception e) {
                JOptionPane.showMessageDialog(this, "El error es:" + "\n" + e, "Error", 0);
            }


            //----------Propiedades Etiquetas
            lblNomSub[i] = new JLabel(nombreSubcategoria);
            lblNomSub[i].setFont(
                    new java.awt.Font("Arial", 3, 14));
            lblNomSub[i].setForeground(Color.white);

            //----------Propiedades cajas de texto
            txtPrecioSubcategoria[i] = new JTextField();
            txtPrecioSubcategoria[i].setSize(
                    50, 14);
            txtPrecioSubcategoria[i].setText(
                    "0");
            txtPrecioSubcategoria[i].setEnabled(
                    false);
            txtPrecioSubcategoria[i].setName(nombreSubcategoria);
            txtPrecioSubcategoria[i].setVisible(
                    true);
            txtPrecioSubcategoria[i].addKeyListener(new java.awt.event.KeyAdapter() {
                @Override
                public void keyTyped(java.awt.event.KeyEvent evt) {
                    actionText(evt, indice);
                }
            });
            //---------Propiedads chkBox
            chkHabilitaSubcategoria[i] = new JCheckBox("Habilitar");
            chkHabilitaSubcategoria[i].setFont(
                    new java.awt.Font("Arial", 1, 10));
            chkHabilitaSubcategoria[i].setForeground(Color.white);
            chkHabilitaSubcategoria[i].addMouseListener(new java.awt.event.MouseAdapter() {
                @Override
                public void mouseClicked(java.awt.event.MouseEvent evt) {
                    actionPanel(evt, indice);
                }
            });

            //---------Propiedades Panel
            jpnPrecios[i] = new JPanel();
            jpnPrecios[i].setBackground(new java.awt.Color(0, 150, 100));
            jpnPrecios[i].setSize(jpnContenedorSubcategorias.getWidth() / 4, jpnContenedorSubcategorias.getHeight());
            jpnPrecios[i].setLayout(new GridLayout(3, 1, 3, 3));
            //Colocando los objetos
            jpnPrecios[i].add(lblNomSub[i], BorderLayout.NORTH);
            jpnPrecios[i].add(txtPrecioSubcategoria[i], BorderLayout.CENTER);
            jpnPrecios[i].add(chkHabilitaSubcategoria[i], BorderLayout.SOUTH);
            jpnPrecios[i].setVisible(true);
            //Colocando todo en el panel
            jpnContenedorSubcategorias.add(jpnPrecios[i]);
        }//Fin if que pregunta si subcategorias = "-"

    }

    private void actionPanel(java.awt.event.MouseEvent evt, final int indice) {
        txtPrecioSubcategoria[indice].setEnabled(chkHabilitaSubcategoria[indice].isSelected());
        if (chkHabilitaSubcategoria[indice].isSelected() == false) {
            txtPrecioSubcategoria[indice].setForeground(Color.BLACK);
            txtPrecioSubcategoria[indice].setFont(
                    new java.awt.Font("Arial", 0, 12));
            txtPrecioSubcategoria[indice].setText("0");
            jpnPrecios[indice].setBackground(new java.awt.Color(0, 150, 100));
        }
        if (chkHabilitaSubcategoria[indice].isSelected() == true) {
            txtPrecioSubcategoria[indice].setFont(
                    new java.awt.Font("Arial", 1, 14));
            txtPrecioSubcategoria[indice].setForeground(Color.BLUE);
            jpnPrecios[indice].setBackground(new java.awt.Color(0, 150, 0));
        }

    }

    private void actionText(java.awt.event.KeyEvent evt, int indice) {
        char key = evt.getKeyChar();
        if ((key < '0' || key > '9') && (key != '\b') && (key != '\n')) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permiten numeros en "
                    + "este campo", "Lestras no permitidas", 0);
        }
        if (txtPrecioSubcategoria[indice].getText().toString().length() > 5) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permite un largo maximo"
                    + " de 6 digitos en este campo.", "Maximo de caracteres alcanzado", 0);
        }
    }

    private void creadorDeProductos() {
        //Creo el control para generar DetalleProducto
        ControlProductDetail cpd = new ControlProductDetail();
        Producto producto = null;
        //Junto en una cadena las horas, minutos y segundos
        //String time = txtHoras.getText() + ":" + txtMinutos.getText() + ":" + txtSegundos.getText();
        String time = spnHora.getValue().toString()
                + ":"
                + spnMinuto.getValue().toString()
                + ":"
                + spnSegundo.getValue().toString();
        try {
            //Detecta si el modo Edicion esta activo
            if (detallePro != null) {
               //Recupera el producto del detalle
                producto = detallePro.getProducto();
                ControlProduct cp = new ControlProduct();
                cp.Update(producto);
                //Elimina los detalles relacionados con el producto
                //para poder crear los nuevos
                cpd.deleteByIDProducto(producto, detallePro.getTipo());
            } else {
                //Si el producto no existe en la base de datos lo crea
                if (isProducto == false) {
                    producto = retornaProducto();
                } else {
                    //Si el producto existe lo busca y lo asigna a un objeto
                    ControlProduct cp = new ControlProduct();
                    producto = cp.selectOneByName(txtNombreProducto.getText());
                }
            }

            for (int i = 0; i < numSubCategorias; i++) {
                //Reviso si la listSubcategorias fue habilitada
                if (chkHabilitaSubcategoria[i].isSelected()) {
                    //Creo el nuevo detalle de Producto
                    cpd.add(
                            producto,//Trae el productoEditar hecho
                            Time.valueOf(time),//Guarda el tiempo de preparacion
                            recipiente(cmbTipo.getSelectedItem().toString()),//Tipo de presentacion (tasa o jarra)
                            retornaSubCategoria(txtPrecioSubcategoria[i].getName()),//Retorna todas listaSubcategorias
                            Integer.parseInt(txtConsumoProducto.getText()),//Consumo del detalle
                            Float.parseFloat(txtPrecioSubcategoria[i].getText()));//Guarda el precio
                }
            }
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, "Error" + e);
        }

    }

    private String recipiente(String recipiente) {
        switch (recipiente) {
            case "Taza":
                recipiente = "Unitario";
                break;
            case "Tetera para 2":
                recipiente = "Jarra2";
                break;
            case "Tetera para 3":
                recipiente = "Jarra3";
                break;
        }
        return recipiente;
    }

    private Categorias retornaCategoria() {
        ControlCategories cc = new ControlCategories();
        String[] idCategoria = cmbCategoria.getSelectedItem().toString().split("-");
        Categorias categoria = cc.selectOne(Integer.parseInt(idCategoria[0]));
        return categoria;
    }

    private Subcategoria retornaSubCategoria(String name) {
        ControlSubcategory subcategoria = new ControlSubcategory();
        return subcategoria.selectOneByName(name);
    }

    private Stock retornaStock() {
        ControlStock cs = new ControlStock();
        String[] idStock = cmbStock.getSelectedItem().toString().split("-");
        Stock stock = cs.selectOne(Integer.parseInt(idStock[0]));
        return stock;
    }

    private List buscaSubcategorias() {
        //Recupero el id de la categoria elegida en el combobox
        String Categoria[] = cmbCategoria.getSelectedItem().toString().split("-");
        //Saco el Id de la categoria
        int idCategoria = Integer.parseInt(Categoria[0]);
        ControlSubcategoryDetail controlSubcatDetail = new ControlSubcategoryDetail();
        ControlCategories cc = new ControlCategories();
        List listSubcategorias = null;
        Categorias categoria = cc.selectOne(idCategoria);
        if (categoria.isSubcategorias()) {
            tieneSubcategorias = true;
            //Obtiene subcategorias para la categoria
            listSubcategorias = controlSubcatDetail.selectByIdCategoria(idCategoria);
        } else {
            tieneSubcategorias = false;
        }
        //Lista llena de subcategorias
        return listSubcategorias;
    }

    private Producto retornaProducto() {
        ControlProduct cp = new ControlProduct();
        cp.add(txtNombreProducto.getText(), retornaCategoria(), retornaStock());
        Producto producto = cp.getLast();
        return producto;
    }

    public boolean validaciones() {

        if (txtNombreProducto.getText().isEmpty()) {
            txtNombreProducto.requestFocus();
            mensajeVal = "El campo Nombre de Producto esta vacio, favor de llenarlo";
            return false;
        } else if (txtConsumoProducto.getText().isEmpty()) {
            txtConsumoProducto.requestFocus();
            mensajeVal = "El campo Consumo del Producto esta vacio, favor de llenarlo";
            return false;
        } else if (Integer.parseInt(txtConsumoProducto.getText().toString()) == 0) {
            mensajeVal = "El campo Consumo del Producto debe ser mayor a 0, favor de corregirlo";
            return false;
        }
        for (int i = 0; i < numSubCategorias; i++) {
            if (chkHabilitaSubcategoria[i].isSelected()) {
                if (txtPrecioSubcategoria[i].getText().isEmpty()) {
                    txtPrecioSubcategoria[i].requestFocus();
                    mensajeVal = "Una Subcategoría seleccionada se encuentra vacía, \nfavor de llenarla o desmarcarla";
                    return false;
                } else {
                    try {
                        if (Integer.parseInt(txtPrecioSubcategoria[i].getText()) == 0) {
                            mensajeVal = "La Subcategoría " + txtPrecioSubcategoria[i].getName()
                                    + " debe tener un Precio mayor a 0, \nfavor de llenarla correctamente o desmarcarla";
                            return false;
                        }
                    } catch (Exception e) {
                        txtPrecioSubcategoria[i].requestFocus();
                        txtPrecioSubcategoria[i].selectAll();
                        mensajeVal = "Una Subcategoría seleccionada no contiene números o tiene simbolos que no lo son, \nfavor de llenarla correctamente o desmarcarla";
                        return false;
                    }
                }
            }
        }
        if (rbnNoGranel.isSelected() == true) {
            int minuto = 0;
            int hora = 0;
            int segundo = 0;
            try {
                hora = (int) spnHora.getValue();
                minuto = (int) spnMinuto.getValue();
                segundo = (int) spnSegundo.getValue();
            } catch (Exception e) {
                mensajeVal = "El tiempo debe estar escrito con numeros "
                        + ", \nfavor de llenarlo correctamente";
                return false;
            }

            if (minuto < 1 && hora == 0) {
                mensajeVal = "El tiempo debe contener al menos 1 minuto"
                        + ", \nfavor de llenarlo correctamente";
                return false;
            }
            if (minuto > 59) {
                mensajeVal = "Las horas solo cuentan con 59 minutos"
                        + ", \nfavor de llenarlo correctamente";
                return false;
            }
            if (segundo > 59) {
                mensajeVal = "Los minutos solo cuentan con 59 segundos"
                        + ", \nfavor de llenarlo correctamente";
                return false;
            }
            if (hora > 24) {
                mensajeVal = "El dia solo cuenta con 24 horas"
                        + ", \nfavor de llenarlo correctamente";
                return false;
            }
        }

        return true;
    }

    private boolean revisaDuplicado(String namePro) {
        ControlProduct cs = new ControlProduct();
        Producto producto = cs.selectOneByName(namePro);
        //Reviso si el producto existe en Productos
        if (producto != null) {
            isProducto = true;
            ControlProductDetail cpd = new ControlProductDetail();
            //Ahora reviso si el tipo ya existe en detalles
            if (cpd.isProductWithType(cmbTipo.getSelectedItem().toString(), namePro)) {
                isTipo = true;
            }
        }
        //Si tanto el Producto y el Tipo ya existen retorna falso
        if (isProducto && isTipo) {
            return true;
        }
        return false;
    }
    private void btnGuardarProductoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnGuardarProductoActionPerformed
        if (validaciones()) {
            //Si el nombre y el tipo no existen y no esta en activo el modo Edicion
            //Crea el producto
            if (revisaDuplicado(txtNombreProducto.getText()) && detallePro == null) {
                JOptionPane.showMessageDialog(this, "Ya existe un producto con el nombre de: "
                        + txtNombreProducto.getText()
                        + " con el tipo: "
                        + cmbTipo.getSelectedItem().toString()
                        + "\nPor favor intente con otro nombre, Gracias", "Error de duplicados", 0);
                txtNombreProducto.requestFocus();
                txtNombreProducto.selectAll();
            } else {
                creadorDeProductos();
                limpiaCampos();
                if (detallePro != null) {
                    try {
                        this.setClosed(true);
                        System.gc();
                    } catch (PropertyVetoException ex) {
                        this.dispose();
                        System.gc();
                    }
                    JOptionPane.showMessageDialog(this, "Producto modificado con exito!", "Guardado", 1);
                } else {
                    JOptionPane.showMessageDialog(this, "Producto guardado con exito!", "Guardado", 1);
                }
            }
        } else {
            JOptionPane.showMessageDialog(this, mensajeVal, "Error existe un campo que ha sido mal escrito", 2);
        }
    }//GEN-LAST:event_btnGuardarProductoActionPerformed

    private void txtConsumoProductoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtConsumoProductoKeyTyped
        char key = evt.getKeyChar();
        if ((key < '0' || key > '9') && (key != '\b') && (key != '\n')) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permiten numeros en "
                    + "este campo", "Lestras no permitidas", 0);
        }
        if (txtConsumoProducto.getText().toString().length() > 11) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permite un largo maximo"
                    + " de 11 digitos en este campo.", "Maximo de caracteres alcanzado", 0);
        }
    }//GEN-LAST:event_txtConsumoProductoKeyTyped

    private void cmbCategoriaPropertyChange(java.beans.PropertyChangeEvent evt) {//GEN-FIRST:event_cmbCategoriaPropertyChange
    }//GEN-LAST:event_cmbCategoriaPropertyChange

    private void cmbCategoriaMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cmbCategoriaMousePressed
        // TODO add your handling code here:
    }//GEN-LAST:event_cmbCategoriaMousePressed

    private void cmbCategoriaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cmbCategoriaActionPerformed
        // TODO add your handling code here:
        if (evt.getSource() == cmbCategoria) {
            inicializaGeneraPrecios();
        }
    }//GEN-LAST:event_cmbCategoriaActionPerformed

    private void cmbCategoriaItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cmbCategoriaItemStateChanged
    }//GEN-LAST:event_cmbCategoriaItemStateChanged

    private void spnHoraKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_spnHoraKeyTyped
        char key = evt.getKeyChar();
        if ((key < '0' || key > '9') && (key != '\b') && (key != '\n')) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permiten numeros en "
                    + "este campo", "Lestras no permitidas", 0);
        }
        if (spnHora.getValue().toString().length() > 2) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permite un largo maximo"
                    + " de 5 digitos en este campo.", "Maximo de digitos alcanzado", 0);
        }
    }//GEN-LAST:event_spnHoraKeyTyped

    private void spnMinutoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_spnMinutoKeyTyped
        char key = evt.getKeyChar();
        if ((key < '0' || key > '9') && (key != '\b') && (key != '\n')) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permiten numeros en "
                    + "este campo", "Lestras no permitidas", 0);
        }
        if (spnMinuto.getValue().toString().length() > 2) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permite un largo maximo"
                    + " de 5 digitos en este campo.", "Maximo de digitos alcanzado", 0);
        }// TODO add your handling code here:
    }//GEN-LAST:event_spnMinutoKeyTyped

    private void spnSegundoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_spnSegundoKeyTyped
        char key = evt.getKeyChar();
        if ((key < '0' || key > '9') && (key != '\b') && (key != '\n')) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permiten numeros en "
                    + "este campo", "Lestras no permitidas", 0);
        }
        if (spnSegundo.getValue().toString().length() > 2) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permite un largo maximo"
                    + " de 2 digitos en este campo.", "Maximo de digitos alcanzado", 0);
        }// TODO add your handling code here:        // TODO add your handling code here:
    }//GEN-LAST:event_spnSegundoKeyTyped

    private void txtNombreProductoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txtNombreProductoKeyTyped
        if (txtNombreProducto.getText().toString().length() > 25) {
            evt.consume();
            JOptionPane.showMessageDialog(this, "Solo se permite un largo maximo"
                    + " de 25 digitos en este campo.", "Maximo de letras alcanzado", 0);
        }
    }//GEN-LAST:event_txtNombreProductoKeyTyped

    private void rbnSiGranelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rbnSiGranelMouseClicked
        spnHora.setEnabled(false);
        spnMinuto.setEnabled(false);
        spnSegundo.setEnabled(false);
    }//GEN-LAST:event_rbnSiGranelMouseClicked

    private void rbnSiGranelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbnSiGranelActionPerformed
        spnHora.setEnabled(false);
        spnMinuto.setEnabled(false);
        spnSegundo.setEnabled(false);
        spnHora.setValue(0);
        spnMinuto.setValue(0);
        spnSegundo.setValue(0);
    }//GEN-LAST:event_rbnSiGranelActionPerformed

    private void rbnNoGranelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_rbnNoGranelMouseClicked
        spnHora.setEnabled(true);
        spnMinuto.setEnabled(true);
        spnSegundo.setEnabled(true);
    }//GEN-LAST:event_rbnNoGranelMouseClicked

    private void rbnNoGranelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_rbnNoGranelActionPerformed
        spnHora.setEnabled(true);
        spnMinuto.setEnabled(true);
        spnSegundo.setEnabled(true);
    }//GEN-LAST:event_rbnNoGranelActionPerformed
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.ButtonGroup btgGranel;
    private javax.swing.ButtonGroup btgSubcategoria;
    private javax.swing.JButton btnCancelarProducto;
    private javax.swing.JButton btnGuardarProducto;
    private javax.swing.JComboBox cmbCategoria;
    private javax.swing.JComboBox cmbStock;
    private javax.swing.JComboBox cmbTipo;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JSpinner jSpinner4;
    private javax.swing.JPanel jpnCategorias;
    private javax.swing.JPanel jpnContenedorSubcategorias;
    private javax.swing.JPanel jpnControles;
    private javax.swing.JPanel jpnGranel;
    private javax.swing.JPanel jpnStock;
    private javax.swing.JPanel jpnTiempo;
    private javax.swing.JScrollPane jspnCosto;
    private javax.swing.JLabel lblInformacionUsuario;
    private javax.swing.JRadioButton rbnNoGranel;
    private javax.swing.JRadioButton rbnSiGranel;
    private javax.swing.JSpinner spnHora;
    private javax.swing.JSpinner spnMinuto;
    private javax.swing.JSpinner spnSegundo;
    private javax.swing.JTextField txtConsumoProducto;
    private javax.swing.JTextField txtNombreProducto;
    // End of variables declaration//GEN-END:variables
}
